/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package controladores;

import beans.Grupo;
import beans.Nota;
import beans.Usuario;
import java.util.ArrayList;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

/**
 *
 * @author nahuel
 */
public class Conexiones {
    
    private Conexiones() {
    }
    
    public static Conexiones getInstance() {
        return ConexionesHolder.INSTANCE;
    }

    private static class ConexionesHolder {
        private static final Conexiones INSTANCE = new Conexiones();
        private static final EntityManagerFactory emf = Persistence.createEntityManagerFactory("loginPU");
        private static final EntityManager em = emf.createEntityManager();
    }
    
      
    public EntityManager getEntity(){
        return ConexionesHolder.em;
    }
    
    public void cerrarEntity(){
        ConexionesHolder.em.close();
    }
        
    /**
     * Este metodo permite obtener un usuario de la base de datos
     * @param nombreUsuario nombre del usuario
     * @return Usuario
     */
    public Usuario getUser(String nombreUsuario){
        try {
            getEntity().getTransaction().begin();
            Usuario usuario = getEntity().find(Usuario.class, nombreUsuario);
            getEntity().getTransaction().commit();
            return usuario;            
        } catch (Exception e) {
            getEntity().getTransaction().rollback();
            return null;
        } 
    }
    
    /**
     * Este metodo permite eliminar una nota de la base de datos
     * @param notaId identificador de la nota
     * @return true si la nota fue eliminada, false en caso contrario
     */
    public boolean eliminarNota(String notaId) {
        try {
            getEntity().getTransaction().begin();
            Nota nota = getEntity().find(Nota.class, Long.parseLong(notaId));
            getEntity().remove(nota);
            getEntity().getTransaction().commit();
            return true;            
        } catch (Exception e) {
            getEntity().getTransaction().rollback();
            return false;
        }
    }
    
    /**
     * * Este metodo permite eliminar una nota de la base de datos
     * @param nota Nota
     * @return true si la nota fue eliminada, false en caso contrario
     */
    public boolean eliminarNota(Nota nota) {
        try {
            getEntity().getTransaction().begin();
            getEntity().remove(nota);
            getEntity().getTransaction().commit();
            return true;            
        } catch (Exception e) {
            getEntity().getTransaction().rollback();
            return false;
        }
    }
    
    /**
     * Este metodo permite modificar los datos de una nota
     * @param id
     * @param posicion_modificar
     * @param descripcion_modificar
     * @param color_modificar
     * @param usuario
     * @return 
     */
    public boolean modificarNota(String id, String posicion_modificar, String descripcion_modificar, String color_modificar, Usuario usuario) {
        try {
            getEntity().getTransaction().begin();
            Nota nota = getEntity().find(Nota.class, Long.parseLong(id));
            nota.setCategoria(posicion_modificar);
            nota.setNota(descripcion_modificar);
            nota.setColor(color_modificar);
            nota.setUsuario(usuario);
            nota = getEntity().merge(nota);
            getEntity().getTransaction().commit();
            return true;            
        } catch (Exception e) {
            getEntity().getTransaction().rollback();
            return false;
        }
    }
    
    /**
     * Este metodo permite obtener una lista de todos los usuarios del sistema
     * @return Lista de Usuarios
     */
    public ArrayList<Usuario> listarUsuarios(){
        try {
            getEntity().getTransaction().begin();
            ArrayList<Usuario> listaUsuarios = (ArrayList<Usuario>) getEntity().createQuery("from Usuario").getResultList();
            getEntity().getTransaction().commit();
            return listaUsuarios;            
        } catch (Exception e) {
            getEntity().getTransaction().rollback();
            return null;
        } 
    }
    
    /**
     * Este metodo permite obtener un grupo
     * @param grupoId identificador del grupo
     * @return Grupo
     */
    public Grupo getGrupo(Long grupoId){
        try {
            getEntity().getTransaction().begin();
            Grupo grupo = getEntity().find(Grupo.class, grupoId);
            getEntity().getTransaction().commit();
            return grupo;
            
        } catch (Exception e) {
            getEntity().getTransaction().rollback();
            return null;
        } 
    }
    
    /**
     * Este metodo permite eliminar un gurpo de la base de datos
     * @param grupo
     * @return true si se elimino, false en caso contrario
     */
    public boolean eliminarGrupo(Grupo grupo) {
        try {
            getEntity().getTransaction().begin();
            getEntity().remove(grupo);
            getEntity().getTransaction().commit();
            return true;            
        } catch (Exception e) {
            getEntity().getTransaction().rollback();
            return false;
        }
    }
    
    /**
     * Este metodo permite guardar un objeto en la base de datos
     * @param object 
     */
    public void persist(Object object) {
        try {
            getEntity().getTransaction().begin();
            getEntity().persist(object);
            getEntity().getTransaction().commit();
        } catch (Exception e) {
            getEntity().getTransaction().rollback();
        } 
    }
}
